home *** CD-ROM | disk | FTP | other *** search
Lex Description | 1990-11-05 | 1.2 KB | 73 lines | [TEXT/KAHL] |
- %{
- #include <stdio.h>
- #include <ctype.h>
- #include <console.h>
-
- #define YYDEBUG
- #define YYSTYPE long
- %}
-
- %token DIGIT
- %left '+' '-'
- %left '*' '/'
- %start line
-
- %%
-
- line : '\n' /* nothing */ { YYACCEPT; }
- | expr '\n' { printf("::%ld\n", $1); YYACCEPT; }
- ;
-
- expr : expr '+' term { $$ = $1 + $3; }
- | expr '-' term { $$ = $1 - $3; }
- | term
- ;
- term : term '*' factor { $$ = $1 * $3; }
- | term '/' factor { $$ = $1 / $3; }
- | factor
- ;
- factor : '(' expr ')' { $$ = $2; }
- | '-' '(' expr ')' { $$ = - ($3); }
- | '-' DIGIT { $$ = - ($2); }
- | DIGIT
- ;
- %%
- main() {
- #ifdef YYDEBUG
- extern int yydebug;
- yydebug = 1;
- console_options.nrows = 14;
- cecho2file("ddy.log", 0, stdout);
- #endif
- printf("\n>>");
- while(true) {
- yyparse();
- printf("\n>>");
- }
- }
-
- yylex() {
- int c;
-
- skip:
- if(isdigit( (c = getchar() ) ) ) {
- yylval = c - '0';
- while(isdigit( (c = getchar() ) ) ) {
- yylval = yylval * 10 + (c - '0');
- }
- ungetc(c, stdin);
- return DIGIT;
- }
- if(strchr("+-*/()\n", c) == NULL) {
- printf("LEXERROR illegal token '%c'\n", c);
- goto skip;
- }
- return c;
- }
-
- yyerror(s) char *s; {
- extern int yychar, yyerrflag;
- fprintf( stderr, (char *)"YACCERR %d: %s\n",
- yyerrflag, s);
- }
-